<?php namespace Admin\Model;
use Hdphp\Model\Model;

class Article extends Model{
	// 设置该模型要操作的表为article
	protected $table = "article";
	// 以下为规则验证
	protected $validate = array(
		array('title','required','文章标题不能为空',3,3),
		array('author','required','作者不能为空',3,3),
		);
	// 设置自动上传。需要自动上传的字段为不能通过post得到参数的字段，第一个参数为字段名称，第二个参数为函数或者方法名称，第三参数为函数或者方法，第四五个参数为什么时候执行该操作
	protected $auto = array(
		array('sendtime','time','function',3,1),
		array('updatetime','time','function',3,3),
		array('thumb','up','method',3,3),
		array('user_uid','uid','method',3,1),
		);

	// 自定义up方法，该方法在执行create方法的时候，触发自动上传，自动上传中的thumb字段调用该方法
	public function up(){
		if(Q('post.thumb')) return Q('post.thumb');
		// 使用框架方法Upload上传文件并且判断文件是否满足要求，该方法返回一个文件上传的信息数组
		$files = Upload::type('jpg,png,gif')->size(2000000)->make();
		if($files){//如果该变量有值，这表示上传成功，则返回保存路径
			return $files[0]['path'];
		}else{//反之，这代表文件上传不成功，不成功有两种情况，一种是文件不符合设定的规则，另一种情况是用户没有上传，如果用户有上传又不成功的话则将错误传入error，如果用户没有上传文件的话则返回一个空字符串
			if($_FILES['thumb']['error'] != 4){
				$this->error = Upload::getError();
			}
			return '';
		}
	}
	// 该方法在自动上传中被调用，为了存入一个用户id，该id值为登陆用户的id值，用来区分哪些文章是哪个用户添加的
	public function uid(){
		return $_SESSION['uid'];
	}
	// 该方法的作用是将post提交的数据添加到数据库。该方法与其他模型中的addData不同的是，添加数据的时候是对三张表进行操作的，所以在验证的时候是分为多个步骤验证，分别需要验证文章表、up方法、文章内容表。通过这三个步骤的验证都没问题后，才开始添加数据到数据库。同样，添加数据库也要分为三个部分，分别是对文章表、中间表、文章内容表进行数据插入
	public function addData(){
		// 以下是验证部分===================

		// 1.文章模型中的create验证
		if(!$this->create()) return false;
		// 2.验证up方法
		if($this->error) return false;
		// 3.文章内容表中的create验证
		$ArticleDataModel = new \Admin\Model\Article_data;
		if(!$ArticleDataModel->create()){
			$this->error = $ArticleDataModel->getError();
			return false;
		}
		// 以下是通过验证后开始上传步骤
		// 1.对文章表进行添加，该操作返回添加的$aid值，该数值在后续添加数据中需要使用到，所以在此处用一个变量$aid接收
		$aid = $this->add();
		// 2.对中间表进行数据插入，通过重组后的数据遍历添加到数据库中
		$arcTagModel = new \Admin\Model\Article_tag;
		foreach (Q('post.tid',array()) as $tid) {
			$data = array(
				'article_aid' => $aid,
				'tag_tid' => $tid
			);
			$arcTagModel->add($data);
		}
		// 3.对文章内容表进行添加，通过重组数组的方式用add方法进行添加。（需要重组数组而不用creata得到的数据进行添加的原因是post提交中没有article_aid字段，所以需要自己组合数据进行添加）
		$data = array(
			'keywords'=>Q('post.keywords'),
			'des'=>Q('post.des'),
			'content'=>Q('post.content'),
			'article_aid'=>$aid
		);
		$ArticleDataModel->add($data);
		// 返回一个true值,为了控制器中的判断使用
		return true;
	}
	// 以下为删除方法，
	public function del(){
		$aid = Q('get.aid');
		// 先删除第一张文章表,并且删除图形文件
		$path = $this->where("aid=$aid")->field('thumb')->find();
		Dir::delFile($path['thumb']);
		// 删除表信息
		$this->where("aid=$aid")->delete();
		// 实例化表内容
		$articleDataModel = new \Admin\Model\article_data;
		// 删除文章内容
		$articleDataModel->where("article_aid=$aid")->delete();
		// 实例化中间表为了删除旧信息
		$articleTagModel = new \Admin\Model\article_tag;
		// 删除中间表对应信息
		$articleTagModel->where("article_aid=$aid")->delete();
		// 跳转回回收站
		go(U('recycle'));
	}
	// 以下为编辑文章方法
	public function editData(){
		// 去得要编辑的文章id
		$aid = Q('get.aid');
		// 检测规则是否符合要求,如果不符合的话就返回false值
		if(!$this->create()) return false;
		if($this->error) return false;
		// 实例化Article_data为了检测Article_data的create
		$ArticleDataModel = new \Admin\Model\Article_data;
		if(!$ArticleDataModel->create()){
			$this->error = $ArticleDataModel->getError();
			return false;
		}
		// 通过以上的检测都没问题后,就可以开始更新数据了
		$this->where("aid=$aid")->save();
		// 用sava方法保存文章内容
		$ArticleDataModel->where("article_aid=$aid")->save();
		// 实例化中间表,为了对修改后的标签进行操作
		$articleTagModel = new \Admin\Model\Article_tag;
		$articleTagModel->where("article_aid=$aid")->delete();
		// 循环重组tid后用add方法进行添加
		foreach (Q('post.tid',array()) as $tid) {
			$tagData = array(
				'article_aid'=>$aid,
				'tag_tid'=>$tid
				);
			// 通过给add方法传参的方式将数据插入到数据库
			$articleTagModel->add($tagData);
		}
		return true;
	}








}